WannaflyCamp day8

补题进度:5/10
敦敦敦 简单动态规划
温暖的WannaflyCamp End Contest


树形dp


树形依赖背包

题意

给出一棵树,根节点为1,每个点有毒素和收获。要求毒素不超过给定值m的情况下使收获最大。一个点的父亲节点被选取后这个点才能被选取

分析

一个点的父亲节点被选取后这个点才能被选取可以转化为dfs序,从大到小选取,做01背包
下面的i都表示dfs序上的第i个节点
定义
$f[i][j]$:考虑了dfs序>=i所有点的容量为j的最大价值
转移
当$j<c[x]$:$f[i][j] <- f[i+size[i]][j]$ 当$j>=c[x]$: $f[i][j] = max(f[i+1][j-c[x]]+v[x],f[i+size[i]][j])$

最后的答案即为 $dp[1][m]$
时间复杂度:$O(n·m)$


树的直径

树形dp,待补
当然两遍dfs/bfs也可以求出来


最远点

给定⼀棵带正边权的⽆向树,求每个点的最远点$(n<=10^5)$
分析
待补


树上独立集

题意

给⼀棵树,每个点有点权,求⼀个点权和最⼤的独⽴集$(n<=10^5)$

分析

  • f[x] 表示 x 没有选的情况下,以 x 为根的⼦树⾥的最⼤点权和独⽴集
  • g[x] 表示 x 选的情况下,以 x 为根的⼦树⾥的最⼤点权和独⽴集
  • f[x]=sum(max(f[x],g[x]))
  • g[x]=v[x]+sum(f[x])
  • 时间复杂度O(n)

区间dp

合并石子


经典的合并石子

定义$dp[i][j]:$ 合并区间[i,j]的最小/最大价值
具体做法:枚举区间长度,区间起点,区间分割点
时间复杂度:$O(n^3)$


2017ICPC(北京) J

题意
n个石子堆排成一排,每次可以将连续的最少L堆,最多R堆石子合并在一起,消耗的代价为要合并的石子总数,求合并成1堆的最小代价,如果无法做到输出0 $(n<=100)$
分析

  • 定义dp[i][j][k]:区间[i,j]合并成k堆石子的最小花费
  • 转移:你会发现k=1和k>1的转移是由区别
  • k=1,dp[i][i+len-1][1]=min(dp[i][i+len-1][1], dp[i][j][k]+dp[j+1][i+len-1][1]+sum[i+len-1]-sum[i-1]);
  • k>1,dp[i][i+len-1][k]=min(dp[i][i+len-1][k], dp[i][j][k-1]+dp[j+1][i+len-1][1]);
  • Trick:在枚举那两段转移的时候,一定有一个区间1段!!!!!

取数字

题意
给⼀个序列 a[1..n],每次可以拿⾛连续⼀段满⾜某些条件的数,拿完后序列会并起来
求最少⼏次把整个序列拿完 $(n<=100)$
分析

  • 定义f[L][R]表示[L..R]最少⼏次取完
  • 考虑 a[L..R]⾥最后取的那⼀段现在是哪些
  • 于是把 a 分成了若⼲段,分别做⼦任务
  • 复杂度视具体情况⽽定

状压dp


Valley Number II(HDU6149)

题意

  • 给定⼀张⽆向图,每个点可能是⾼点或者低点,三个点(x,y,z)被称为⼀个valley当且仅当 x,z 是⾼点,y是低点,且存在边(x,y)和(y,z)
  • 现在要求最多有⼏个valley,每个点最多只能在⼀个valley⾥
  • N<=30,⾼点数量<=15

分析

  • 定义f[i][s]:表示考虑了前i个点,高点的使用情况为s,最多的valley数量
  • 转移,枚举低点,对于当前最低点枚举两个高点转移即可
  • Trick:滚动数组要把上一层的数先继承过来,再更新

奇怪的道路

题意

  • 求有多少⽆向图满⾜有n个点m条边,且每个点度数为偶数,并且对于每条边 (u,v) 都有 1<=|u-v|<=K
  • n,m<=30
  • K<=8

分析


独⽴集

题意

  • 给定⼀张 n 个点的⽆向图,⼩ A 会随机⼀个 [1..n] 的排列,然后按这个排列的顺序来贪⼼选独⽴集
  • 求选出来的独⽴集的期望值
  • n<=20

分析


数位dp


概率dp



训练题


A

签到


B

题意

题解


C

题意

题解


D

签到


E

题意

题解

待补
考虑每对(i,j)的概率,FFT加速


F

留坑


G

对于每个$w_i$考虑每个位置的算的次数,可以发现不断枚举L,R,前缀和序列$a_i$,算出贡献即可


H

题意

题解

结论:同一高度黑色都为偶数个先手输,反之先手赢
证明:


I

分为两种情况即可

  1. 根选的话,考虑每个子树选的数量
  2. 根不选,考虑每个子树内部的组合方案

J

复读机模拟